package com.study.designmodes.service.liabilityChain.v1;

/**
 * 使用责任链模式的写法，既然责任链模式的特点是“链上的每个对象都持有下一个对象的引用”，那么我们就这么做。
 * 抽象出一个AbstractPrepareFilter
 *
 * @author yangyanbin
 * @since 20230321
 **/
public abstract class AbstractPrepareFilter {

    /**
     * 定义下一个对象的引用
     */
    private AbstractPrepareFilter nextPrepareFilter;

    /**
     * 用于传递下一个对象的引用方法
     *
     * @param nextPrepareFilter
     */

    public AbstractPrepareFilter(AbstractPrepareFilter nextPrepareFilter) {
        this.nextPrepareFilter = nextPrepareFilter;
    }

    /**
     * 处理
     * 在抽象类中持有下一个对象的引用nextPrepareFilter，如果有，则执行；如果没有表示链上所有对象都执行完毕，执行Study类的study()
     *
     * @param preparationList
     * @param study
     */
    public void doFilter(PreparationList preparationList, Study study) {
        prepare(preparationList);

        if (nextPrepareFilter == null) {
            study.study();
        } else {
            nextPrepareFilter.doFilter(preparationList, study);
        }

    }

    /**
     * 留一个抽象方法prepare给子类去实现，
     *
     * @param preparationList
     */
    public abstract void prepare(PreparationList preparationList);
}
